package com.example.d4_collection_set;

/**
 * 目标：了解哈希值
 * Java中的所有对象,都可以调用Object类提供的hashCode方法,返回该对象自己的哈希值
 * public int hashCode(): 返回对象的哈希值
 */
public class SetTest2 {
    public static void main(String[] args) {
        // 对象哈希值的特点
        // 1.同一个对象多次调用hashCode()方法返回的哈希值是相同的
        // 2.不同的对象,它们的哈希值一般不相同,但也有可能会相同称为(哈希碰撞)
        Student s1 = new Student("蜘蛛精", 25, 169.5);
        Student s2 = new Student("紫霞", 22, 166.5);
        System.out.println(s1.hashCode());
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

        /*
        HashSet底层原理：使用 数组+链表+红黑树
        1.默认创建一个长度为16的数组,默认加载因子是0.75
        2.使用元素的哈希值对数组长度求余计算除应该存入的位置
        3.判断当前位置是否为null,如果是null直接存入
        4.如果不为null,表示是有元素的,则调用equals方法,看是否相同,如果相同,则不存
        jdk8之前,新元素存入数组,栈老元素的位置,老元素挂在新元素的下面
        jdk8之后,新元素直接挂在老元素的下面
         */

        // 特殊情况
        String str1 = new String("abc");
        String str2 = new String("acD");
        System.out.println(str1.hashCode());
        System.out.println(str2.hashCode());
    }
}
